package com.dao.hibernate;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;

import com.dao.UsuarioDAO;
import com.model.Usuario;



public class UsuarioDAOHibernate implements UsuarioDAO {
	
	private Session sessao;
	
	@Override
	public void salvar(Usuario usuario) {
		this.sessao.save(usuario);
	}
	
	public Session getSessao() {
		return sessao;
	}

	public  void setSessao(Session sessao) {
		this.sessao = sessao;
	}
	
	@SuppressWarnings("unchecked")
	@Override
	public List<Usuario> listar() {
		Criteria lista = sessao.createCriteria(Usuario.class);
		return lista.list();
		
	}

	@Override
	public void excluir(Usuario usuario) {
		this.sessao.delete(usuario);
	}

	@Override
	public Usuario pesquisarPorLogin(String login) {
		String sql = "from Usuario u where u.login like :login";
		Query consulta = sessao.createQuery(sql);
		consulta.setString("login", "%" + login + "%");
		return (Usuario) consulta.uniqueResult();
		
		
	}

	@Override
	public Usuario buscaLogin(String login) {
		String sql = "from Usuario u where u.login =  :login";
		Query consulta = this.sessao.createQuery(sql);
		consulta.setString("login",login);
				
		return (Usuario) consulta.uniqueResult();
	}
	
	
	@Override
	public void alterar(Usuario usuario) {
		if (usuario.getPermissao() == null || usuario.getPermissao().size() == 0) {
			Usuario usuarioPermissao = this.carregar(usuario.getId());
			usuario.setPermissao(usuarioPermissao.getPermissao());
			this.sessao.evict(usuarioPermissao);
		}
		
		
		this.sessao.update(usuario);
	}

	public Usuario carregar(Integer codigo) {
		//TODO o hibernate nao conseguira fazer a carga caso seja passado o Usuario
		// no parametro, tem que ser diretamente a chave (integer)
		return (Usuario) this.sessao.get(Usuario.class, codigo);
	}

	

}
